package com.yuhuihui.common.utils;

import com.yuhuihui.common.annotation.result.SuccessInfo;

import java.lang.reflect.Method;

/**
 * controller操作成功信息替换工具类
 *
 * @author yuhh
 * @date 2023-05-25 14:43:13
 */
public final class SuccessInfoUtil {

    /**
     * 线程message变量
     */
    private static final ThreadLocal<String> MESSAGE_THREAD_LOCAL = new ThreadLocal<>();

    /**
     * 如果满足该类中有指定方法且方法上有SuccessInfo注解，则改变该线程变量的message的值
     * 因为注解是单例，所以用了迂回的方式，声明一个线程变量
     * 同一个类中无法有相同的方法名
     *
     * @param cls        指定类
     * @param methodName 指定方法名
     * @param message    需要改变的message值
     * @author yuhh
     * @date 2023-05-25 14:44:52
     */
    public static void changeMessage(Class cls, String methodName, String message) {
        //如果满足该类中有指定方法且方法上有SuccessInfo注解，则改变该线程变量的message的值
        Method[] methods = cls.getDeclaredMethods();
        for (Method m : methods) {
            if (m.getName().equals(methodName) && m.isAnnotationPresent(SuccessInfo.class)) {
                MESSAGE_THREAD_LOCAL.set(message);
                break;
            }
        }
    }

    /**
     * 获取线程变量message的值
     *
     * @return {@link String } 线程变量message的值
     * @author yuhh
     * @date 2023-05-25 14:44:59
     */
    public static String getMessage(){
        return MESSAGE_THREAD_LOCAL.get();
    }

    /**
     * 清除线程变量message的值
     *
     * @author yuhh
     * @date 2023-05-25 14:43:45
     */
    public static void cleanMessage(){
        MESSAGE_THREAD_LOCAL.remove();
    }

    private SuccessInfoUtil(){

    }
}
